package com.yuju.login.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.yuju.common.core.dao.IBaseDao;
import com.yuju.common.core.service.AbstractBaseService;
import com.yuju.login.dao.IMenuDao;
import com.yuju.login.dao.entity.Menu;
import com.yuju.login.model.MenuModel;
import com.yuju.login.service.IMenuService;
import com.yuju.model.TreeModel;
import com.yuju.util.Utils;

/**
 * 
 * 类名：MenuServiceImpl  <br />
 *
 * 功能：
 *
 * @author : zhousc <br />
 * @Date : 2017年12月4日 上午10:47:30  <br />
 * @version : 1.1 <br />
 */
@Service
public class MenuServiceImpl extends AbstractBaseService<MenuModel, Menu, String> implements IMenuService{

	@Autowired
	private IMenuDao menuDao;
	
	@Override
	public IBaseDao<MenuModel, Menu, String> getDao() {
		// TODO Auto-generated method stub
		return menuDao;
	}

	/**
	 * 
	 * 功能: <br/>
	 * 
	 * 重写：zhousc <br/>
	 * 
	 * @Date ：2017年12月4日 上午10:48:20<br/>
	 * 
	 * @param menuModel
	 * @return <br/>
	 * @see com.yuju.common.core.service.AbstractBaseService#save(java.lang.Object)
	 */
	@Override
	public int save(MenuModel menuModel){
		return this.getDao().saveSelective(menuModel);
	}
	/**
	 * 
	 * 功能: <br/>
	 * 
	 * 重写：zhousc <br/>
	 * 
	 * @Date ：2017年12月4日 上午10:48:54<br/>
	 * 
	 * @param menuModel
	 * @return <br/>
	 * @see com.yuju.common.core.service.AbstractBaseService#updateSelective(java.lang.Object)
	 */
	@Override
	public int updateSelective(MenuModel menuModel){
		return this.getDao().updateSelective(menuModel);
	}

	/**
	 * 
	 * 功能: 角色编辑页 菜单树<br/>
	 * 
	 * 重写：zhousc <br/>
	 * 
	 * @Date ：2017年12月4日 下午2:12:00<br/>
	 * 
	 * @return <br/>
	 * @see com.yuju.login.service.IMenuService#getMenuTree()
	 */
	@Override
	public List<TreeModel> getMenuTree(MenuModel menuModel) {
		//查询所有菜单
		List<MenuModel> menuList = this.getDao().list(getBeanMap(menuModel));
		List<TreeModel> returnList = this.menuTree(menuList);
		return returnList;
	}
	
	
	/**
	 * 
	 * 功能：组装菜单树<br/>
	 *
	 * @author zhousc
	 * @Date 2017年12月4日 下午8:06:05 <br/>
	 */
	@Override
	public List<TreeModel> menuTree(List<MenuModel> menuList){
			//重新包装菜单
			List<TreeModel> treeList = new ArrayList<>();
			for(int i = 0; i < menuList.size(); i++){
				TreeModel treeModel = new TreeModel();
				treeModel.setId(menuList.get(i).getId().toString());
				treeModel.setLabel(menuList.get(i).getName());
				treeModel.setPath(menuList.get(i).getPath());
				treeModel.setPid(menuList.get(i).getPid());
				treeModel.setIsGroup(menuList.get(i).getIsGroup());
				treeModel.setIcon(menuList.get(i).getIcon());
				treeList.add(treeModel);
			}
						
			//返回参数
			List<TreeModel> returnList = new ArrayList<>();
					
			// 先找到所有的一级菜单
			for (int i = 0; i < treeList.size(); i++) {
				// 一级菜单没有parentId
				if ("0".equals(treeList.get(i).getPid())) {
				     returnList.add(treeList.get(i));
					}
	        }
			// 为一级菜单设置子菜单，getChild是递归调用的
			for(int i = 0;i < returnList.size(); i++){
	            List<TreeModel> child = getMenusAllChild(returnList.get(i).getId().toString(),treeList);		            returnList.get(i).setChildren(child);
			}
			return returnList;
	 }
	/**
	 * 
	 * 功能：为菜单树查询子菜单<br/>
	 *
	 * @author zhousc
	 * @Date 2017年12月4日 下午2:50:01 <br/>
	 */
	 private List<TreeModel> getMenusAllChild(String id, List<TreeModel> rootMenu) {
	        // 子菜单
	        List<TreeModel> childList = new ArrayList<>();
	        for (TreeModel menu : rootMenu) {
	            // 遍历所有节点，将父菜单id与传过来的id比较
	            if (Utils.isNotNull(menu.getPid())) {
	                if (menu.getPid().equals(id)) {
	                    childList.add(menu);
	                }
	            }
	        }
	        // 把子菜单的子菜单再循环一遍
	        for (TreeModel menu : childList) {// 没有url子菜单还有子菜单
	            if (Utils.isNull(menu.getPath())) {
	                // 递归
	                menu.setChildren(getMenusAllChild(menu.getId(), rootMenu));
	            }
	        } // 递归退出条件
	        if (childList.size() == 0) {
	            return null;
	        }
	        return childList;
	    }
	 /**
	  * 
	  * 功能:根据角色ID查询菜单信息 <br/>
	  * 
	  * 重写：zhousc <br/>
	  * 
	  * @Date ：2017年12月5日 上午10:22:56<br/>
	  * 
	  * @param roleId
	  * @return <br/>
	  * @see com.yuju.login.service.IMenuService#menuListByRoleId(java.lang.String)
	  */
	 @Override
	public List<MenuModel> menuListByOpId(String opId) {
		// TODO Auto-generated method stub
		return convert(menuDao.menuListByOpId(opId));
	}
}